package digimon;

import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

import digimon.organism.BodyOrganism;
import digimon.organism.Organism;
import digimon.random.RandomNumberGenerator;
import digimon.scheduler.ProgramRunner;

public class Main {
	public static int instructionSetSize = 20;
	public static long time = System.currentTimeMillis();
	public static RandomNumberGenerator rng = new RandomNumberGenerator(time);

	public static boolean running=true;
    static int tamCasca = 9;    //tamanho da casca
    static int tamGrid = 40;    //tamanho do Grid
    //posicao da fonte de comida
    static int posComidaX=tamGrid-1, posComidaY=(int)(tamGrid/2);
    
    // Create a thread to run the analizer
    static ProgramRunner runner;
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("Seed: " + time);
		
		//String[] colunas = new String[tamGrid];
	    String[][] dados = new String [tamGrid][tamGrid];
	    //posicoes iniciais da casca
        int[] posCasca= {1, (int)(tamGrid/2)-(int)(tamCasca/2)};

		
        // Create a new organism body
        BodyOrganism body = new BodyOrganism(tamCasca, tamCasca);        
        
		//cria a tabela na tela
        for(int i=0; i<tamGrid; i++)
        {
            //colunas[i]="";
            for(int j=0; j<tamGrid; j++) dados[j][i]="";
        }
        //JTable jtable = new JTable(dados,colunas);
        JTable jtable = new JTable(tamGrid,tamGrid);
        JScrollPane scrollPane = new JScrollPane(jtable);
        jtable.setFillsViewportHeight(true);
        JFrame mainFrame = new JFrame("");
        mainFrame.setSize(700, 700);
        mainFrame.setLocationRelativeTo(null);
        mainFrame.add(scrollPane);
        mainFrame.setVisible( true );
        
        // Create and start the runner thread
        runner = new ProgramRunner(body);
        
        /**
         * Main loop
         */
        while(running)
        {
            //desenho da casca
            desenha(posCasca, jtable, body);           //funcao que desenha na tela os organismos
            // cont++;
            try {
                Thread.sleep(250);                       //sleep usado para reduzir a velocidade, permitindo melhor visualização
            } catch (InterruptedException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
            // analisa(posCasca, body);                  //função que analisa os acontecimentos, responsavel pela dinamica do programa
            // See the return of run
            int returnMessage = runner.run();
            switch(returnMessage){
	            case ProgramRunner.BACK:
	            	posCasca[0]++;
	            	System.out.println("BACK");
	            	break;
	            case ProgramRunner.FRONT:
	            	System.out.println("FRONT");
	            	/*if(posCasca[0]>0)
	            		posCasca[0]--;*/
	            	break;
	            case ProgramRunner.T_LEFT:
	            	System.out.println("T_LEFT");
	            	break;
	            case ProgramRunner.T_RIGHT:
	            	System.out.println("T_RIGHT");
	            	break;
	            	
            	default:
            		break;
            }
        }
        desenha(posCasca, jtable, body);
        
	}
	
	/**
	 * //função que desenha a tabela na tela
	 * @param pos
	 * @param table
	 * @param body An organism
	 */
    public static void desenha(int[] pos, JTable table, BodyOrganism body)    
    {
        //limpa o grid completamente
        for(int i=0; i<tamGrid; i++)
        {
            for(int j=0; j<tamGrid; j++)
            {
                table.setValueAt("", i, j);         //seta todas celulas do grid como vazias
            }
        }

        //posiciona a comida
        table.setValueAt("S", posComidaX, posComidaY);      //desenha a fonte de energia (comida) no Grig

        //desenha a casca
        for (int i=(pos[0]-1); i<=(pos[0]+tamCasca); i++)             //desenha a casca, que eh toda de "#"
        {
            if (i==(pos[0]-1)||i==(pos[0]+tamCasca))
            {
                for(int j=pos[1]; j<(pos[1]+tamCasca); j++)
                {
                    table.setValueAt("#", i, j);
                }
            }else
            {
                if (i==pos[0] || i ==(pos[0]+tamCasca-1))
                {

                    table.setValueAt("#", i, pos[1]);
                    table.setValueAt("#", i, pos[1]+tamCasca-1);
                }
                table.setValueAt("#", i, pos[1]-1);
                table.setValueAt("#", i, pos[1]+tamCasca);
            }
        }

        // Draw the organisms
        Organism[][] org = body.getBodyCells();
        int k;
        for(int i=0; i<tamCasca; i++)
        {
            for(int j=0; j<tamCasca; j++)
            {
            	k = org[i][j].getORG_TIPE();
                switch(k){
                	case 0:
                		table.setValueAt("G", i+pos[0], j+pos[1]);
                		break;
                	case 1:
                		table.setValueAt("V", i+pos[0], j+pos[1]);
                		break;
                	case 2:
                		table.setValueAt("C", i+pos[0], j+pos[1]);
                		break;
                	case 3:
                		table.setValueAt("M", i+pos[0], j+pos[1]);
                		break;
            		default:
            			break;
                }
                /*{
                    table.setValueAt("V", i+pos[0], j+pos[1]);
                } 
                if (body.getBodyCells()[i][j].getORG_TIPE() == 3)
                {
                    table.setValueAt("P", i+pos[0], j+pos[1]);
                }  
                if (body.getBodyCells()[i][j].getORG_TIPE() == 2)
                {
                    table.setValueAt("C", i+pos[0], j+pos[1]);
                } 
                if (body.getBodyCells()[i][j].getORG_TIPE() == 0)
                {
                    table.setValueAt("G", i+pos[0], j+pos[1]);
                } 
                */
            }
        }
    }
    
    



}
